iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0

其實在目前我都一直認為
同步執行完之後就會去執行非同步
概觀來說是這樣沒錯,但是在非同步的世界裡面,也有先後順序的。
我會以我目前了解的方式,跟大家share一下,分享一下研究成果XD

首先我目前理解起來執行順序是這樣的

一般同步執行 =>  nextTick Queue => 
promise callback(.then裡面) => 一般的異步程序

那簡單來介紹一下NextTick Queue 是什麼存在

  1. 他會在非同步順序裡面優先被執行
  2. 也就是說,他適合拿來在某些異步操作之前的任務執行
  3. 只要在佇列中,有它存在就會優先執行,

再來就是 MicroTask Queue(promise 進入.then之後的狀態)

  1. 如果沒有NextTick Queue 就會先以這個執行為第二優先
  2. 只有在進入.then之後才是MicroTask Queue,在那之前還是同步的範圍

再來提供一下node.js Event Loop的順序

圖片引用自參考文章

直接上code

//一般同步執行 >  nextTick Queue > promise callback > 一般的callback

//第一個執行
console.log("同步開始");

process.nextTick(function () {
  //第五個執行
  console.log("nextTick1");
});

//第十個執行
setTimeout(function () {
  console.log("setTimeout如果超過1秒,則在執行的時候跑完一遍整個loop,才會輪到他,所以會在setImmediate之後");
}, 1000);

//第八個執行
setTimeout(function () {
  console.log("setTimeout如果是0因為是Timer,就會先被執行會在setImmediate(Check)之上");
}, 0);

new Promise(function (resolve, reject) {
  //第二個執行
  console.log("promise裡面的同步"); //雖然宣告是 Promise 但沒有進入.then 也就是沒有callback,所以接著執行
  resolve("resolve");
}).then(function (result) {
  //第七個執行
  console.log("promise then,第二優先");
});

(async function () {
  //第三個執行
  console.log("async本質也還是promise"); //  他本質上也還是promise,沒進入.then 所以log會在第一輪執行
})();

//第九個執行
setImmediate(function () {
  console.log("setImmediate,屬於Check");
});

//第六個執行
process.nextTick(function () {
  console.log("nextTick2");
  setTimeout(function () {
    //第十一個執行
    console.log("setTimeout即使被包在nextTick2底下,他依舊是setTimeout,依照執行順序會是最後一個,因為秒數最久");
  }, 2000);
});

//第四個執行
console.log("同步結束");

大家可以印去玩玩看。

參考資料

完整圖解Node.js的Event Loop(事件迴圈)

裡面有更詳細的解說,我這邊大概就是去體會他的內容,並且去執行印出來,加上一些註解去方便自己去對應loop的規則


上一篇
第十八天 介紹一下好用的array method
下一篇
第二十天 EventEmitter 觀察者模式
系列文
Node.js隨手札記 想到什麼就說什麼的30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言